﻿using Newtonsoft.Json;
using S7.Net;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Zhaoxi.FactoryDeviceSystem.Models;

namespace Zhaoxi.FactoryDeviceSystem.Utils
{
    public class CommonHelper
    {
        public static bool IsUpdateDevices = false;//标识是否设备信息配置已更改
        public static bool IsUpdateStores = false;//标识是否更改了存储位置 
        public static List<DeviceInfo> deviceList = new List<DeviceInfo>();//设备列表数据
        public static List<StoreSetInfo> storeSets = new List<StoreSetInfo>();//存储配置列表
        public static string folder = ConfigurationManager.AppSettings["folder"].ToString();
        public static string communicatePath=Application.StartupPath+"/" + ConfigurationManager.AppSettings["communicatePath"].ToString();
        public static string devicesPath= Application.StartupPath + "/" + ConfigurationManager.AppSettings["devicePath"].ToString();
        public static string storesPath= Application.StartupPath + "/" + ConfigurationManager.AppSettings["storePath"].ToString();
        public static PLCInfo plcSet = null;//plc设置
        //加载已有的PLC设置
        public static void LoadPLCSet()
        {
            if(File.Exists(communicatePath))
            {
                string plcString=File.ReadAllText(communicatePath);
                if(!string.IsNullOrEmpty(plcString) )
                {
                    string[] arr=plcString.Split(';');
                    plcSet = new PLCInfo();
                    plcSet.CpuType = (CpuType)Enum.Parse(typeof(CpuType), arr[0].Split(':')[1]);
                    plcSet.Ip = arr[1].Split(':')[1];
                    plcSet.Port = arr[2].Split(':')[1].GetInt() ;
                    plcSet.Rack = arr[3].Split(':')[1].GetShort();
                    plcSet.Slot = arr[4].Split(':')[1].GetShort();
                }
            }
        }

        /// <summary>
        /// 加载设备信息
        /// </summary>
        //public static void LoadDeviceList()
        //{
        //    deviceList.Clear();
        //    if (File.Exists(devicesPath))
        //    {
        //        string json = File.ReadAllText(devicesPath);//读取设备配置文件中的文本
        //        deviceList = JsonConvert.DeserializeObject<List<DeviceInfo>>(json);//反序列化对象列表
        //    }
        //}

        /// <summary>
        /// 加载设备信息并执行地址格式验证
        /// </summary>
        /// <remarks>
        /// 执行流程：
        /// 1. 清空当前设备列表
        /// 2. 检查配置文件存在性
        /// 3. 反序列化JSON设备列表
        /// 4. 校验每个设备的地址格式
        /// 5. 静默移除所有无效设备
        /// </remarks>
        /// <exception cref="JsonException">当JSON反序列化失败时抛出</exception>
        public static void LoadDeviceList()
        {
            deviceList.Clear();
            if (File.Exists(devicesPath))
            {
                // 反序列化阶段
                string json = File.ReadAllText(devicesPath);
                deviceList = JsonConvert.DeserializeObject<List<DeviceInfo>>(json);

                // -------------------- 地址验证阶段 --------------------
                // 目的：确保内存中的设备列表只包含有效地址的设备
                var invalidDevices = new List<DeviceInfo>();
                foreach (var device in deviceList)
                {
                    try
                    {
                        AddressParser.Parse(device.StateAddress);
                    }
                    catch (ArgumentException ex)
                    {
                        // 生产环境建议替换为日志系统调用
                        // 示例：_logger.LogError(ex, "设备{DeviceId}地址无效", device.Id);
                        Console.WriteLine($"设备地址验证失败: {ex.Message}");
                        invalidDevices.Add(device);
                    }
                }

                // 清理无效设备（注意：此处直接修改主列表，需确保线程安全）
                foreach (var invalidDevice in invalidDevices)
                {
                    deviceList.Remove(invalidDevice);
                }
            }
        }

        /// <summary>
        /// 加载存储配置
        /// </summary>
        public static void LoadStoreSets()
        {
            storeSets.Clear();
            if (File.Exists(storesPath))
            {
                string json = File.ReadAllText(storesPath);//读取设备配置文件中的文本
                storeSets = JsonConvert.DeserializeObject<List<StoreSetInfo>>(json);//反序列化对象列表
            }
        }
    }
}
